অ্যাডভান্স এসকিউএল (Advanced SQL) হল SQL-এর উন্নত স্তরের ফিচার এবং কৌশল যা সাধারণত ডেটাবেসের জটিল কাজ, বৃহৎ ডেটাসেট পরিচালনা এবং উন্নত কুয়েরি অপটিমাইজেশনের জন্য ব্যবহৃত হয়। অ্যাডভান্স SQL ব্যবহারকারীকে ডেটাবেসের আরও জটিল অপারেশন, যেমন সাব-কুয়েরি, জয়েন, ট্রানজেকশন ম্যানেজমেন্ট, উইন্ডো ফাংশন এবং পারফরম্যান্স টিউনিং শিখতে সহায়তা করে।
এখানে অ্যাডভান্স এসকিউএল এর কিছু প্রধান কৌশল এবং কনসেপ্ট আলোচনা করা হলো:
সাব-কুয়েরি হল একটি কুয়েরি যা আরেকটি কুয়েরির মধ্যে অন্তর্ভুক্ত থাকে। সাব-কুয়েরি ব্যবহার করে, আপনি মূল কুয়েরি থেকে পৃথকভাবে একটি কুয়েরি চালাতে পারেন এবং তার ফলাফল ব্যবহার করতে পারেন।
এটি মূল কুয়েরির WHERE
, FROM
, অথবা SELECT
অংশে ইনপুট হিসেবে ব্যবহার করা হয়।
SELECT name, age FROM Employees WHERE age > (SELECT AVG(age) FROM Employees);
এটি Employees টেবিলের age
এর গড় থেকে বেশি বয়সের কর্মীদের নির্বাচন করবে।
এটি একটি একক মান রিটার্ন করে।
SELECT name, (SELECT MAX(salary) FROM Employees) FROM Employees;
এটি প্রতিটি কর্মীর নাম এবং সর্বোচ্চ বেতন রিটার্ন করবে।
JOIN হল SQL এর একটি গুরুত্বপূর্ণ টেকনিক যা একাধিক টেবিলের মধ্যে সম্পর্ক তৈরি করে এবং তাদের মধ্যে ডেটা একত্র করে। অ্যাডভান্স SQL-এ বিভিন্ন ধরনের JOIN ব্যবহার করা হয়।
এটি দুটি টেবিলের মধ্যে যে রেকর্ডগুলি একে অপরের সাথে মিলছে, তা ফেরত দেয়।
SELECT Employees.name, Departments.name
FROM Employees
INNER JOIN Departments ON Employees.department_id = Departments.id;
এটি Employees
এবং Departments
টেবিলের মধ্যে মিলিত রেকর্ডগুলি ফিরিয়ে আনবে।
এটি প্রথম টেবিলের সব রেকর্ড এবং দ্বিতীয় টেবিলের সাথে মেলে এমন রেকর্ডগুলি ফেরত দেয়।
SELECT Employees.name, Departments.name
FROM Employees
LEFT JOIN Departments ON Employees.department_id = Departments.id;
এটি সব কর্মী এবং তাদের সম্পর্কিত বিভাগের নাম ফিরিয়ে আনবে, যদি বিভাগ না থাকে তবে NULL
ফিরিয়ে আনবে।
এটি দ্বিতীয় টেবিলের সব রেকর্ড এবং প্রথম টেবিলের সাথে মেলে এমন রেকর্ডগুলি ফেরত দেয়।
SELECT Employees.name, Departments.name
FROM Employees
RIGHT JOIN Departments ON Employees.department_id = Departments.id;
এটি সব বিভাগ এবং তাদের কর্মীদের নাম ফিরিয়ে আনবে, যদি কোনো কর্মী না থাকে তবে NULL
ফিরিয়ে আনবে।
এটি প্রথম এবং দ্বিতীয় টেবিলের সমস্ত রেকর্ড ফেরত দেয়, যা মিল বা না মিল কোনটি হতে পারে।
SELECT Employees.name, Departments.name
FROM Employees
FULL OUTER JOIN Departments ON Employees.department_id = Departments.id;
এটি সব কর্মী এবং সব বিভাগ ফিরিয়ে আনবে, যেখানে কোনো মেল না খেলে NULL
দেখাবে।
GROUP BY ক্লজ ব্যবহার করে, আপনি ডেটাকে গ্রুপ করতে পারেন এবং কিছু ফাংশন যেমন SUM()
, COUNT()
, AVG()
এর মাধ্যমে গ্রুপের উপর সঞ্চালিত কিছু পরিসংখ্যান তৈরি করতে পারেন।
SELECT department_id, COUNT(*) FROM Employees GROUP BY department_id;
এটি Employees টেবিল থেকে প্রতিটি বিভাগের কর্মীদের সংখ্যা প্রদান করবে।
HAVING ক্লজ ব্যবহার করে আপনি GROUP BY এর পরে শর্ত দিতে পারেন।
SELECT department_id, AVG(salary)
FROM Employees
GROUP BY department_id
HAVING AVG(salary) > 50000;
এটি সমস্ত বিভাগের জন্য গড় বেতন প্রদান করবে যেখানে গড় বেতন ৫০,০০০ এর বেশি।
উইন্ডো ফাংশন সাধারণত PARTITION BY, ORDER BY এবং OVER ক্লজ ব্যবহার করে একাধিক রেকর্ডের উপর গণনা চালায়, যা প্রতিটি রেকর্ডের সাথে সম্পর্কিত একটি ফলাফল প্রদান করে।
SELECT name, department_id, ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rank
FROM Employees;
এটি Employees টেবিলের কর্মীদের বেতন অনুযায়ী র্যাঙ্ক প্রদান করবে, তবে এটি বিভাগ অনুযায়ী পার্টিশন করে র্যাঙ্ক তৈরি করবে।
SELECT name, department_id, RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rank
FROM Employees;
এটি Employees টেবিলের কর্মীদের র্যাঙ্ক প্রদান করবে, যেখানে সমান বেতনের কর্মীদের জন্য একই র্যাঙ্ক প্রদান করবে।
SQL ট্রানজ্যাকশন ব্যবহারের মাধ্যমে আপনি ডেটাবেসের সমস্ত পরিবর্তন একত্রে, নিরাপদভাবে এবং সঠিকভাবে করতে পারেন। এটি COMMIT, ROLLBACK, এবং SAVEPOINT এর মাধ্যমে কাজ করে।
BEGIN TRANSACTION;
UPDATE Employees SET salary = salary + 5000 WHERE department_id = 1;
COMMIT;
এটি সমস্ত পরিবর্তন সম্পন্ন করে এবং ডেটাবেসে সেগুলি সেভ করবে। যদি আপনি চান যে কোনো ভুলের কারণে সবকিছু পূর্বের অবস্থায় ফিরে আসুক, তবে ROLLBACK
ব্যবহার করতে হবে।
BEGIN TRANSACTION;
UPDATE Employees SET salary = salary + 5000 WHERE department_id = 1;
ROLLBACK;
BEGIN TRANSACTION;
UPDATE Employees SET salary = salary + 5000 WHERE department_id = 1;
SAVEPOINT my_savepoint;
UPDATE Employees SET salary = salary + 3000 WHERE department_id = 2;
ROLLBACK TO SAVEPOINT my_savepoint;
COMMIT;
এটি একটি পয়েন্ট তৈরি করবে যেখানে আপনি চাইলে ট্রানজ্যাকশন পূর্ববর্তী অবস্থায় ফিরিয়ে নিতে পারবেন।
Stored Procedure এবং Function ব্যবহার করে আপনি ডেটাবেসে লজিক বা কোড সংরক্ষণ করতে পারেন, যা বারবার ব্যবহার করা যেতে পারে। এগুলি SQL কুয়েরি অপটিমাইজেশন এবং পুনঃব্যবহারযোগ্যতা নিশ্চিত করতে সাহায্য করে।
CREATE PROCEDURE IncreaseSalary (IN emp_id INT, IN inc_amount INT)
BEGIN
UPDATE Employees SET salary = salary + inc_amount WHERE id = emp_id;
END;
এটি একটি Stored Procedure তৈরি করবে, যা নির্দিষ্ট কর্মীর বেতন বৃদ্ধি করবে।
অ্যাডভান্স এসকিউএল হল SQL-এর উন্নত ফিচারগুলি যা ডেটাবেস পরিচালনা এবং জটিল কুয়েরি লেখার জন্য ব্যবহৃত হয়। এর মধ্যে JOIN, GROUP BY, HAVING, Subqueries, Window Functions, Transactions, Stored Procedures ইত্যাদি অন্তর্ভুক্ত। এই কৌশলগুলি ব্যবহার করে আপনি ডেটাবেসের তথ্য আরও কার্যকরীভাবে বিশ্লেষণ, আপডেট, এবং পরিচালনা করতে পারেন।
স্বল্প সময়ের জন্য ডেটাবেজে কোনো তথ্য জমা রাখতে SQL অস্থায়ী(Temporary) টেবিল ব্যবহার করা হয়।
- অস্থায়ী টেবিলের অনেক ধরণের সুবিধা রয়েছে। RDBMS ডেটাবেজ সিস্টেমে অস্থায়ী টেবিল সাপোর্ট করে।
- অস্থায়ী টেবিল ব্যবহার করে আপনি ডেটাবেজ টেবিলে তথ্য জমা রাখার পাশাপাশি অন্যান্য টেবিলের মত
SELECT
,UPDATE
,JOIN
ইত্যাদি SQL কমান্ড সম্পাদন করতে পারবেন।- অস্থায়ী তথ্য সংরক্ষনের জন্য কিছু কিছু ক্ষেত্রে অস্থায়ী টেবিল অতীব প্রয়োজন হয়ে পড়ে। যেমন- বর্তমান ইউজারের শেষন(session) সমাপ্ত হবে এমন সময় তার সকল তথ্য মুছে ফেলার জন্য অস্থায়ী টেবিল ব্যবহৃত হয়। MySql ভার্সন ৩.২৩ এবং পরবর্তী ভার্সন-সমূহে অস্থায়ী টেবিল যুক্ত হয়েছে।
বিঃদ্রঃ যতক্ষন পর্যন্ত শেষন(session) সক্রিয় থাকে কেবল ততক্ষন পর্যন্তই অস্থায়ী টেবিলে তথ্য সংরক্ষিত থাকে।
আপনি যদি পিএইচপি স্ক্রিপ্ট এর মাধ্যমে SQL কোড রান করান তাহলে পিএইচপি কোড সম্পাদন শেষে অস্থায়ী(Temporary) টেবিলে সংরক্ষিত তথ্য স্বয়ংক্রিয়ভাবে মুছে যাবে।
আপনি যদি MySQL ডেটাবেজকে এক্সেস(Access) করার জন্য MySql Client Program ব্যবহার করে থাকেন তাহলে প্রোগ্রামটি বন্ধ হওয়ার পরে অস্থায়ী টেবিলটি মুছে যাবে। অথবা আপনি নিজ থেকে ম্যানুয়ালিও টেবিলটি মুছে ফেলতে পারেন।
CREATE TEMPORARY TABLE name_of_table (
name_of_column,
name_of_column,
...
);
নিম্নের উদাহরনে আমরা অস্থায়ী টেবিলের ব্যবহার দেখবোঃ
CREATE TEMPORARY TABLE Student_works (
Student_name VARCHAR(50) NOT NULL,
Total_submited_work VARCHAR(50) NOT NULL
);
অস্থায়ী টেবিল গুলো আমরা স্বল্প প্রয়োজনে ব্যবহার করবো। এতে ডেটাবেজে জায়গাও সাশ্রয় হয়।
আপনি ডেটাবেজে কখনই অস্থায়ী টেবিলের তথ্য দেখতে পারবেন না। আপনি যদি SHOW TABLES
কমান্ড ব্যবহার করে আপনার টেবিল লিষ্ট বের করেন সেখানেও অস্থায়ী টেবিলটি খুঁজে পাবেন না। এখন আপনি যদি লগ-আউট করেন অর্থাৎ আপনার বর্তমান MySql সেশনটি শেষ হওয়ার পর আপনি আর এই টেবিলের তথ্য গুলো অ্যাক্সেস(Access) করতে পাবেন না। এমন কি আপনার অস্থায়ী টেবিলটিও আর থাকবে না।
MySql ডেটাবেজের ক্ষেত্রে ডেটাবেজ কানেকশনের সমাপ্তি ঘটলেই অস্থায়ী টেবিল মুছে যায়। কিন্তু আপনি যাদি ডেটাবেজের কাজ সম্পন্ন হওয়ার পূর্বেই অস্থায়ী টেবিল মুছে ফেলতে চান তাহলে DROP TABLE
কমান্ড ব্যবহার করতে পারেন।
DROP TABLE name_of_table;
SQL Injection হলো কোড ইঞ্জেক্ট করার একটি কৌশল যা আপনার ডেটাবেজকে ধ্বংস করে দিতে পারে।
ওয়েবপেজ এর মাধ্যমে ডেটাবেজে খারাপ(malicious ) কোড ইনপুট/জমা করে রাখাই হলো SQL Injection।
ওয়েব সাইট হ্যাকিং কৌশলগুলোর মধ্য SQL Injection অন্যতম।
পূর্ববর্তী অধ্যায়গুলোতে আমরা শিখে এসেছি SQL ব্যবহার করে কিভাবে ডেটাবেজের তথ্য আপডেট এবং পুনরূদ্ধার করতে হয়।
ওয়েব পেজে ইউজারদেরকে প্রায়ই তাদের নিজস্ব সার্চ ভ্যালু ব্যবহার করার অনুমতি দেওয়া হয় যা ব্যবহার করে তারা ওয়েব পেজের তথ্য প্রদর্শন করতে পারে।
SQL স্টেটমেন্ট-সমূহ শুধুমাত্র টেক্সট হওয়ায় ইউজার খুব সহজেই ডায়নামিকভাবে SQL কোড গুলোকে পরিবর্তন করে ফেলতে পারেঃ
ওয়েবপেজ থেকে আপনি যখন ইউজারকে তথ্য ইনপুট এর সুযোগ দেন কেবল তখনই SQL Injection ঘটে। যেমন- আপনি ইউজারকে তার নাম/আইডি ইনপুট করতে বললেন, কিন্তু সে নাম/আইডি এর পরিবর্তে ইনপুট হিসাবে নিম্নের ন্যায় SQL কমান্ড ইনপুট দিল এবং যা আপনি আপনার নিজের অজান্তেই আপনার ডেটাবেজে রান করালেন।
উদাহরণ
solidUserId = getRequestString("User_Id");
solidSQL = "SELECT * FROM Total_Users
WHERE User_Id = " + solidUserId;
উপরের উদাহরণে সিলেক্ট স্ট্রিং এর সাথে solidUserId ভ্যারিয়েবলটি যোগ করে একটি SELECT
স্টেটমেন্ট তৈরি করা হয়েছে যা ইউজার এর নিকট হতে তথ্য ইনপুট নিয়ে ডেটাবেজ থেকে সংশ্লিষ্ট তথ্য নিয়ে আসে।
SQL Injection
এমন একটি কৌশল যা ওয়েব পেজের মাধ্যমে ডেটাবেজে খারাপ কোড ইনপুট দিয়ে SQL কমান্ড ইঞ্জেক্ট করতে পারে।
ইঞ্জেক্টকৃত SQL কমান্ড পূর্ববর্তী SQL কমান্ড গুলোকে পরিবর্তন করতে পারে যা ওয়েব এপ্লিকেশনের নিরাপত্তায় বিঘ্ন সৃষ্টি করে।
উপরের উদাহরণটিতে আরো একবার লক্ষ্য করুন, ঐ কোডের মূল উদ্দেশ্য ছিল ইউজার আইডির মাধ্যমে একটি ইউজারকে সিলেক্ট করার জন্য SQL স্টেটমেন্ট তৈরি করা।
যদি ইউজারকে ভুল ইনপুট প্রদানে বাধা দেওয়া না হয়, তাহলে ইউজার নিম্নের মত কিছু স্মার্ট ইনপুট প্রবেশ করাবেঃ
User_Id:
<input type="text" value="103 or 1=1">
সার্ভারের ফলাফল
SELECT * FROM Total_Users WHERE User_Id = 103 or 1=1
উপরের কোড একটি বৈধ SQL স্টেটমেন্ট। যেহেতু WHERE 1 = 1 সর্বদাই সত্য, সুতরাং ইহা ইউজার টেবিল থেকে সকল তথ্য রিটার্ন করবে।
উপরের উদাহরণটি কি আপনার কাছে বিপজ্জনক বলে মনে হচ্ছে?
একবার ভেবে দেখুন যদি এই টেবিলে ইউজার এর নাম এবং পাসওয়ার্ড থাকতো তাহলে কি হত?
নিম্নের SQL স্টেটমেন্টি অনেকটা উপরের স্টেটমেন্ট এর মতইঃ
SELECT User_Id, User_Name, User_Pass
FROM Total_Users WHERE User_Id = 103 or 1=1
এক্ষেত্রে একজন স্মার্ট হ্যাকার ইনপুট ফিল্ডে 103 অথবা 1=1 ইনপুট করে ডেটাবেজ থেকে খুব সহজেই ইউজারের সকল তথ্য অ্যাক্সেস করতে পারবে।
ইউজার লগ-ইন ভেরিফাই করার জন্য নিম্নে একটি সাধারন এইচটিএমএল ফর্ম এর গঠন দেওয়া হলোঃ
User Name:
<input type="text">
Password:
<input type="text">
User_Name = getRequestString("User_Name");
User_Pass = getRequestString("User_Pass");
sql = "SELECT * FROM Total_Users WHERE User_Name ='" + User_Name + "'
AND User_Pass ='" + User_Pass + "'"
এক্ষেত্রে একজন স্মার্ট হ্যাকার ইনপুট ফিল্ডে " " OR " "=" " ইনপুট করে খুব সহজেই ডেটাবেজ থেকে ইউজারের সকল তথ্য অ্যাক্সেস করতে পারে।
সার্ভার কোড নিম্নের মত একটি বৈধ SQL স্টেটমেন্ট তৈরি করবেঃ
SELECT * FROM Total_Users WHERE User_Name ="" or ""=""
AND User_Pass ="" or ""=""
উপরের স্টেটমেন্টটি একটি বৈধ SQL স্টেটমেন্ট। এটি টেবিল থেকে ইউজারের সকল তথ্য রিটার্ন করবে যেখানে WHERE ""="" সর্বদাই সত্য।
অধিকাংশ ডেটাবেজই ব্যাচ SQL স্টেটমেন্ট সাপোর্ট করে। দুই বা ততোধিক SQL স্টেটমেন্ট এর সমষ্টিই হলো ব্যাচ SQL স্টেটমেন্ট। একটি স্টেটমেন্ট থেকে অন্য একটি স্টেটমেন্টকে আলাদা করতে সেমিকোলন ব্যবহার করা হয়।
SELECT * FROM Total_Users;
DROP TABLE Users_Student;
উপরের SQL স্টেটমেন্টটি "Total_Users" টেবিলের সকল তথ্য রিটার্ন করবে এবং "Users_Student" টেবিলটিকে ডিলেট করে দিবে।
ধরুন, নিম্নের ন্যায় আমাদের সার্ভার কোড আছেঃ
solidUserId = getRequestString("User_Id");
solidSQL = "SELECT * FROM Total_Users WHERE User_Id = " + solidUserId;
এবং একজন ইউজার নিম্নের মত ইনপুট দিলঃ
User id:
<input type="text" value="103; DROP TABLE Users_Student" style="width:50%">
তাহলে সার্ভারে নিম্নের মত একটি বৈধ SQL স্টেটমেন্ট তৈরি হবেঃ
SELECT * FROM Total_Users WHERE UserId = 103;
DROP TABLE Users_Student;
কোনো কোনো ওয়েব ডেভেলোপার কিছু নির্দিষ্ট শব্দ বা ক্যারেক্টারকে "blacklist" করে রাখে। হ্যাকাররা যেন এই শব্দ বা ক্যারেক্টার গুলো ইনপুট ফিল্ডের সার্স প্যারামিটার হসাবে ব্যবহার করে SQL ইনজেকশন ঘটাতে না পারে।
ইহা খুব একটা কার্যকরী পদ্ধতি নয়। কিছু শব্দ যেমন- delete
অথবা drop
এবং কিছু ক্যারেক্টার যেমন- সেমিকোলন(;) অথবা উদ্ধৃতি চিহ্ন("") সকল SQL ভাষাতেই ব্যবহত হয়। তাই এই শব্দ বা ক্যারেক্টারসমূহ ইনপুটে সম্মতি দেওয়া উচিৎ।
SQL ইনজেকশন আক্রমণকে প্রতিরোধ করার সবচেয়ে কার্যকরী এবং সঠিক পদ্ধতি হলো SQL প্যারামিটার ব্যবহার করা।
SQL প্যারামিটার হলো ভ্যালু যা SQL কুয়েরি সম্পাদনের সময় যুক্ত করা হয়। ইহা SQL এর কন্ট্রোলার হিসাবে কাজ করে।
আপনি যদি আপনার ওয়েবসাইটের মাধ্যমে ডেটাবেজে ডেটা সংরক্ষন করে পুনরায় পেতে চান তাহলে আপনার ওয়েব সার্ভার SQL ভাষা ব্যবহার করে এমন একটি ডেটাবেজে-সিস্টেমে এক্সেস থাকতে হবে।
আপনি যদি Internet Service Provider(ISP) কর্তৃক আপনার ওয়েব সার্ভার হোস্ট করে থাকেন তাহলে আপনাকে SQL হোস্টিং প্ল্যান খুঁজতে হবে। MySQL, SQL Server, MS SQL Server এবং MS Access ইত্যাদি রিলেশনাল ডেটাবেজ-সমূহ সচারচর ব্যবহত SQL হোস্টিং ডেটাবেজ ।
MySQL ওয়েবসাইটের জন্য জনপ্রিয় এবং অধিক ট্রাফিকযুক্ত একটি ডেটাবেজ সফটওয়্যার।
MySQL অনেক শক্তিশালী এবং সম্পূর্ন বৈশিষ্ট্যযুক্ত SQL ডেটাবেজ সিস্টেম।
ডেটাবেজ চালিত অধিক ট্রাফিকযুক্ত ওয়েবসাইটের জন্য ওরাকলও একটি জনপ্রিয় ডেটাবেজ সফটওয়্যার।
ওরাকল অনেক শক্তিশালী এবং সম্পূর্ন বৈশিষ্ট্যযুক্ত SQL ডেটাবেজ সিস্টেম।
ডেটাবেজ চালিত অধিক ট্রাফিকযুক্ত ওয়েবসাইটের জন্য মাইক্রোসফট SQL সার্ভার একটি জনপ্রিয় ডেটাবেজ সফটওয়্যার।
SQL সার্ভার অনেক শক্তিশালী এবং সম্পূর্ন বৈশিষ্ট্যযুক্ত SQL ডেটাবেজ সিস্টেম।
মাইক্রোসফট এক্সেস সাধারণ ডেটাবেজের জন্য একটি ভালো সমাধান।
অধিক ট্রাফিকযুক্ত ওয়েব সাইটের জন্য এক্সেস ভালো কাজ করে না এবং ইহা MySQL, SQL সার্ভার অথবা ওরাকলের মত শক্তিশালী না।
common.read_more